package config

import (
	"encoding/json"
	"log"
	"os"
	"path/filepath"
	"strings"
	"time"

	"gopkg.in/yaml.v3"
)

// ServerConfig TCP服务器配置
type ServerConfig struct {
	Host              string        `json:"host"`               // 监听地址
	Port              int           `json:"port"`               // 监听端口
	MaxConnections    int           `json:"max_connections"`    // 最大连接数
	ReadBufferSize    int           `json:"read_buffer_size"`   // 读缓冲区大小
	WriteBufferSize   int           `json:"write_buffer_size"`  // 写缓冲区大小
	HeartbeatInterval time.Duration `json:"heartbeat_interval"` // 心跳间隔
	EventWorkerNum    int           `json:"event_worker_num"`   // 事件处理工作协程数
}

// ClientConfig TCP客户端配置
type ClientConfig struct {
	ServerHost     string        `json:"server_host"`     // 服务器地址
	ServerPort     int           `json:"server_port"`     // 服务器端口
	ReconnectDelay time.Duration `json:"reconnect_delay"` // 重连延迟
	Timeout        time.Duration `json:"timeout"`         // 超时时间
}

// MessageConfig 消息配置
type MessageConfig struct {
	MaxMessageSize int `json:"max_message_size"` // 最大消息大小
	HeaderSize     int `json:"header_size"`      // 消息头大小
}

// Config 全局配置
type Config struct {
	Server   ServerConfig   `json:"server"`
	Client   ClientConfig   `json:"client"`
	Message  MessageConfig  `json:"message"`
	Database DatabaseConfig `json:"database"`
}

// DefaultConfig 默认配置
func DefaultConfig() *Config {
	return &Config{
		Server: ServerConfig{
			Host:              "0.0.0.0",
			Port:              8080,
			MaxConnections:    10000,
			ReadBufferSize:    1024,
			WriteBufferSize:   1024,
			HeartbeatInterval: 30 * time.Second,
			EventWorkerNum:    10,
		},
		Client: ClientConfig{
			ServerHost:     "127.0.0.1",
			ServerPort:     8088,
			ReconnectDelay: 5 * time.Second,
			Timeout:        10 * time.Second,
		},
		Message: MessageConfig{
			MaxMessageSize: 1024 * 1024, // 1MB
			HeaderSize:     4,           // 4字节消息长度头
		},
		Database: *DefaultDatabaseConfig(),
	}
}

// LoadConfig 从文件加载配置（支持JSON和YAML格式）
func LoadConfig(filename string) (*Config, error) {
	config := DefaultConfig()
	file, err := os.Open(filename)
	if err != nil {
		log.Fatal(err)
		return config, nil // 文件不存在时返回默认配置
	}
	defer file.Close()

	// 根据文件扩展名选择解析器
	ext := strings.ToLower(filepath.Ext(filename))
	switch ext {
	case ".yaml", ".yml":
		decoder := yaml.NewDecoder(file)
		err = decoder.Decode(config)
	default:
		decoder := json.NewDecoder(file)
		err = decoder.Decode(config)
	}

	if err != nil {
		return nil, err
	}

	return config, nil
}

// SaveConfig 保存配置到文件（支持JSON和YAML格式）
func SaveConfig(filename string, config *Config) error {
	file, err := os.Create(filename)
	if err != nil {
		return err
	}
	defer file.Close()

	// 根据文件扩展名选择编码器
	ext := strings.ToLower(filepath.Ext(filename))
	switch ext {
	case ".yaml", ".yml":
		encoder := yaml.NewEncoder(file)
		encoder.SetIndent(2)
		return encoder.Encode(config)
	default:
		encoder := json.NewEncoder(file)
		encoder.SetIndent("", "  ")
		return encoder.Encode(config)
	}
}
